package com.zhixi.pattern.notimportant.abstractfactorypattern;

import com.zhixi.pattern.notimportant.abstractfactorypattern.operation.Human;
import com.zhixi.pattern.notimportant.abstractfactorypattern.operation.humanfactory.FemaleFactory;
import com.zhixi.pattern.notimportant.abstractfactorypattern.operation.humanfactory.MaleFactory;

/**
 *
 * 抽象工厂模式
 *
 *  因为人有皮肤颜色，还有性别，所以一个工厂创建的人，性别是男，女呢？
 *  所以分为男性工厂，和女性工厂
 *
 *  一个接口（Human），多个抽象类实现（AbstractBlackHuman、AbstractWhiteHuman、AbstractYellowHuman）
 *  为了区分人皮肤颜色，然而性别不能确定所以需要细分
 *
 *  sex包中：区分每个人的性别，分别继承抽象类重写方法
 *
 *  最后由FemaleFactory和MaleFactory实现公共接口（HumanFactory），因为有共同的方法
 *  这两个工厂就是最终创建的，一个创建男性，一个创建女性
 *
 *  优点：封装性
 *
 *  缺点：扩展性，如果要扩展一个类，首先需要增加一个类，还需要修改工厂里面的方法
 *      违背了开闭原则（禁止修改，可以扩展）
 *
 *
 * @作者 ShuHaoNan
 * @邮箱 shuhaonan1@gmail.com
 * @时间 2020/11/15 11:01
 */
public class AbstractFactoryPattern {

    public static void main(String[] args) {
        MaleFactory maleHumanFactory = new MaleFactory();
        FemaleFactory FemaleHumanFactory = new FemaleFactory();
        /* 男性小黑人 */
        Human maleHumanFactoryBlackHuman = maleHumanFactory.createBlackHuman();
        maleHumanFactoryBlackHuman.getColor();
        maleHumanFactoryBlackHuman.getSex();

        /* 男性小黄人 */
        maleHumanFactory.createYellowHuman();
        /* 男性小白人 */
        maleHumanFactory.createWhiteHuman();

        /* 女性小黑人 */
        Human femaleHumanFactoryBlackHuman = FemaleHumanFactory.createBlackHuman();
        femaleHumanFactoryBlackHuman.getColor();
        femaleHumanFactoryBlackHuman.getSex();

        /* 女性小黄人 */
        FemaleHumanFactory.createYellowHuman();
        /* 女性小白人 */
        FemaleHumanFactory.createWhiteHuman();

    }

}
